# プロジェクト2 LED の明るさを調整する **(1) 説明** 前のレッスンでは、LED のオン・オフを制御し、点滅させました。 このプロジェクトでは、PWM を通じて LED の明るさを制御し、呼吸効果をシミュレートします。同様に、コード内のステップ長さと遅延時間を変更することで、異なる呼吸効果を表現することができます。 PWM はデジタル手段を使用してアナログ出力を制御する方法です。デジタル制御は、異なるデューティサイクル(高レベルと低レベルの間で常に切り替わる信号)を持つ矩形波を生成し、アナログ出力を制御します。一般的に、ポートの入力電圧は 0V と 5V です。3V が必要な場合はどうでしょうか?または 1V、3V、3.5V の間で切り替える場合はどうでしょうか?抵抗を常に変更することはできません。このため、PWM を使用します。 ![](./media/bbcfcb9ae56abb7e80ee587246fc4be9.GIF) Arduino のデジタルポート電圧出力には、LOW と HIGH の 2 つの状態のみがあり、これらは 0V と 5V の電圧出力に対応します。LOW を 0、HIGH を 1 と定義し、Arduino が 1 秒以内に 500 個の 0 または 1 の信号を出力させることができます。 500 個の 1 を出力する場合、それは 5V です。すべてが 1 の場合、それは 0V です。このように 010101010101 を出力する場合、出力ポートは 2.5V になります。これは映画を見ているようなものです。私たちが見ている映画は完全に連続しているわけではありません。実際には 1 秒間に 25 枚の画像を出力します。この場合、人間は気づくことができず、PWM も同様です。異なる電圧が必要な場合は、0 と 1 の比率を制御する必要があります。単位時間あたりに出力される 0 と 1 の信号が多いほど、制御がより正確になります。 **(2) 仕様** - 制御インターフェース:デジタルポート - 動作電圧:DC 3.3-5V - ピン間隔:2.54mm - 表示色:赤 **(3) コンポーネント** ![](./media/image-20250902170952089.png) **(4) 接続図** ![](./media/image-20250902171013917.png) **(5) テストコード** ```c /* keyestudio Mini Tank Robot V2.1 lesson 2.2 pwm-slow http://www.keyestudio.com */ int ledPin = 10; // LED ピンを D10 に定義 int value; void setup () { pinMode (ledPin, OUTPUT); // ledpin を出力として初期化 } void loop () { for (value = 0; value <255; value = value + 1) { analogWrite (ledPin, value); // LED が徐々に明るくなる delay (30); // 30MS 遅延 } for (value = 255; value> 0; value = value-1) { analogWrite (ledPin, value); // LED が徐々に暗くなる delay (30); // 30MS 遅延 } } ``` **テスト結果** テストコードを正常にアップロードすると、LED は明るさから暗さへと徐々に変化し、人間の呼吸のようになり、すぐにオン・オフになることはありません。 **コード説明** いくつかのステートメントを繰り返す必要がある場合、FOR ステートメントを使用できます。 FOR ステートメントの形式は以下の通りです: ![](./media/image-20250902171421873.png) または循環シーケンス: ラウンド 1:1 → 2 → 3 → 4 ラウンド 2:2 → 3 → 4 … 数字 2 が成立しなくなるまで、「for」ループは終了します。 この順序を理解した後、コードに戻ります: **for (int value = 0; value < 255; value=value+1){** **...** **}** **for (int value = 255; value >0; value=value-1){** **...** **}** 2 つの「for」ステートメントにより、value は 0 から 255 に増加し、その後 255 から 0 に減少し、その後 255 に増加し、...無限ループします。 以下に新しい関数があります ----- analogWrite() デジタルポートには 0 と 1 の 2 つの状態のみがあることを知っています。では、アナログ値をデジタル値に送信するにはどうすればよいでしょうか?ここで、この関数が必要です。Arduino ボードを観察し、PWM 信号を出力できる「~」でマークされた 6 つのピンを見つけてください。 **関数形式は以下の通りです:** **analogWrite(pin,value)** analogWrite() は PWM ポートに 0~255 のアナログ値を書き込むために使用されるため、値は 0~255 の範囲内です。ピン 3、5、6、9、10、11 など、PWM 機能を持つデジタルピンにのみ書き込むことに注意してください。 PWM はデジタル方法を通じてアナログ量を取得する技術です。デジタル制御は矩形波を形成し、矩形波信号はオン・オフ(つまり、高レベルまたは低レベル)の 2 つの状態のみを持ちます。オン・オフの継続時間の比率を制御することで、0~5V の電圧を シミュレートできます。オン(学術的には高レベルと呼ばれます)の時間をパルス幅と呼ぶため、PWM はパルス幅変調とも呼ばれます。 以下の 5 つの矩形波を通じて、PWM についてさらに理解しましょう。 ![](./media/image-20250902172304373.png) 上の図では、緑色の線は 1 周期を表し、analogWrite() の値はデューティサイクルと呼ばれるパーセンテージに対応します。 デューティサイクルは、1 周期内の高レベル継続時間を低レベル継続時間で割ったものを意味します。上から下へ、最初の矩形波のデューティサイクルは 0% で、対応する値は 0 です。LED の明るさは最も低く、つまりオフです。高レベルが続く時間が長いほど、LED は明るくなります。したがって、最後のデューティサイクルは 100% で、255 に対応し、LED は最も明るくなります。25% はより暗いことを意味します。 PWM は主に LED の明るさまたはモーターの回転速度を調整するために使用されます。 これはスマートロボットカーの制御において重要な役割を果たします。次のプロジェクトに入るのを待ちきれないと思います。